To Do

library(stringr)
library(tidyverse)
library(data.table)
ConnectCalls <- fread("/Users/guslipkin/Downloads/Florida Poly- Senior Capstone Group/ConnectCalls.csv", na.strings = "")
colnames(ConnectCalls) <- c("EncounterID",
                            "LastStatus",
                            "UpdatedOn",
                            "AQ1", "AQ1_Date",
                            "AQ2", "AQ2_Date",
                            "AQ3", "AQ3_Date",
                            "AQ4", "AQ4_Date",
                            "AQ5", "AQ5_Date",
                            "AQ6", "AQ6_Date",
                            "AQ7", "AQ7_Date",
                            "AQ8", "AQ8_Date",
                            "AQ9", "AQ9_Date",
                            "AQ10", "AQ10_Date",
                            "AQ11", "AQ11_Date",
                            "AQ12", "AQ12_Date",
                            "AQ13", "AQ13_Date",
                            "AQ14", "AQ14_Date",
                            "AQ15", "AQ15_Date",
                            "AQ16", "AQ16_Date",
                            "AQ17", "AQ17_Date",
                            "AQ18", "AQ18_Date",
                            "AQ19", "AQ19_Date",
                            "AQ20", "AQ20_Date",
                            "AQ21", "AQ21_Date",
                            "AQ22", "AQ22_Date",
                            "AQ23", "AQ23_Date",
                            "AQ24", "AQ24_Date")

factorCols <- c("EncounterID", "LastStatus", 
                names(ConnectCalls)[names(ConnectCalls) %like% "AQ[0-9]{1,2}$"])
ConnectCalls[, (factorCols) := lapply(.SD, as.factor), .SDcols = factorCols]

dateCols <- c("UpdatedOn", 
              names(ConnectCalls)[names(ConnectCalls) %like% "AQ[0-9]{1,2}_Date"])
dateFun <- function(x) as.Date(x, format = "%m/%d/%y")
ConnectCalls[, (dateCols) := lapply(.SD, dateFun), .SDcols = dateCols]

head(ConnectCalls)
aqCols <- c("EncounterID", "LastStatus", "UpdatedOn",
            names(ConnectCalls)[names(ConnectCalls) %like% "AQ[0-9]{1,2}$"])
ConnectLongerAQ <- melt.data.table(ConnectCalls[!is.na(EncounterID), ..aqCols],
                                 measure.vars = paste0("AQ", 1:24),
                                variable.name = "AQ_Number",
                                value.name = "AQ_Value")

aqCols <- c("EncounterID", "LastStatus", "UpdatedOn",
  names(ConnectCalls)[names(ConnectCalls) %like% "AQ[0-9]{1,2}_Date"])
ConnectLongerAQDate <- melt.data.table(ConnectCalls[!is.na(EncounterID), ..aqCols],
                                       measure.vars = paste0("AQ", 1:24, "_Date"),
                                       variable.name = "AQ_Number",
                                       value.name = "AQ_Date")

ConnectLongerAQDate[, AQ_Number := str_replace(AQ_Number, "_Date", "")]

ConnectLonger <- merge(ConnectLongerAQ, ConnectLongerAQDate)[!is.na(AQ_Value)]
rm(ConnectLongerAQ, ConnectLongerAQDate)
head(ConnectLonger)

ConnectLonger[, .N, by = "AQ_Value"][order(desc(N))] %>%
  ggplot(aes(x = AQ_Value, y = N, label = N)) +
  geom_col(fill = "lightblue") +
  geom_text(size = 5, position = position_stack(vjust = 0.5)) +
  theme(axis.text.x = element_text(angle = 90))

Surveys <- fread("/Users/guslipkin/Downloads/Florida Poly- Senior Capstone Group/Surveys.csv", na.strings = "")

factorCols <- c(names(Surveys)[! names(Surveys) %in% c("AdmitDate",
                                                       "CMS_Reportable",
                                                       "MortalityFlag")])
Surveys[, (factorCols) := lapply(.SD, as.factor), .SDcols = factorCols]

dateCols <- c("AdmitDate")
dateFun <- function(x) as.Date(x, format = "%m/%d/%y")
Surveys[, (dateCols) := lapply(.SD, dateFun), .SDcols = dateCols]

Surveys$CMS_Reportable <- ifelse(Surveys$CMS_Reportable == "Yes", TRUE, FALSE)
Surveys$MortalityFlag <- ifelse(Surveys$MortalityFlag == "Y", TRUE, FALSE)

logicalCols <- c("CMS_12", "CMS_18", "CMS_21")
logicalFun <- function(x) ifelse(x == 1, TRUE, FALSE)
Surveys[, (logicalCols) := lapply(.SD, logicalFun), .SDcols = logicalCols]
Surveys <- Surveys[, -c("CMS_42", "CMS_43", "CMS_44")]

head(Surveys)
cmsCols <- c("SurveyID", 
            names(Surveys)[names(Surveys) %like% "CMS_[0-9]{1,2}$"])
SurveysLonger <- melt.data.table(Surveys[!is.na(SurveyID), ..cmsCols],
                                 measure.vars = paste0("CMS_", c(1:3, 6:8, 10:13, 
                                                                 18:28, 30, 33:34, 
                                                                 37:41)),
                                 variable.name = "CMS_Number",
                                 value.name = "CMS_Response")[!is.na(CMS_Response)]
Warning in melt.data.table(Surveys[!is.na(SurveyID), ..cmsCols], measure.vars = paste0("CMS_",  :
  'measure.vars' [CMS_1, CMS_2, CMS_3, CMS_6, ...] are not all of the same type. By order of hierarchy, the molten data value column will be of type 'character'. All measure variables not of type 'character' will be coerced too. Check DETAILS in ?melt.data.table for more on coercion.
SurveysLonger[!(CMS_Number %in% c("CMS_12", "CMS_18", "CMS_21", "CMS_23"))] %>%
  .[, CMS_Response := as.factor(CMS_Response)] %>%
  .[, .N, by = list(CMS_Number, CMS_Response)] %>%
  ggplot(aes(x = CMS_Number, y = N, fill = factor(CMS_Response, levels = c(5:0)))) +
  geom_bar(position = "fill", stat = "identity") +
  theme(axis.text.x = element_text(angle = 90),
        legend.title = element_blank())


SurveysLonger[(CMS_Number %in% c("CMS_12", "CMS_18", "CMS_21"))] %>%
  .[, CMS_Response := as.factor(CMS_Response)] %>%
  .[, .N, by = list(CMS_Number, CMS_Response)] %>%
  ggplot(aes(x = CMS_Number, y = N, fill = CMS_Response)) +
  geom_bar(position = "fill", stat = "identity") +
  theme(axis.text.x = element_text(angle = 90),
        legend.title = element_blank())


SurveysLonger[CMS_Number == "CMS_23"] %>%
  .[, CMS_Response := as.factor(CMS_Response)] %>%
  .[, .N, by = list(CMS_Number, CMS_Response)] %>%
  ggplot(aes(x = CMS_Number, y = N, fill = factor(CMS_Response, levels = c(10:0)))) +
  geom_bar(position = "fill", stat = "identity") +
  theme(axis.text.x = element_text(angle = 90),
        legend.title = element_blank())

Readmissions <- fread("/Users/guslipkin/Downloads/Florida Poly- Senior Capstone Group/Readmissions.csv", na.strings = "")

colnames(Readmissions) <- str_replace_all(names(Readmissions), 
                                          pattern = " ", 
                                          replacement = "")

factorCols <- c(names(Readmissions)[! names(Readmissions) %in% c("IndexDischDate", 
                                                                 "ReadmitDate", 
                                                                 "DaysBetweenAdmssions", 
                                                                 "ReadmitDischargeDate", 
                                                                 "ReadmitInfo.Age")])
Readmissions[, (factorCols) := lapply(.SD, as.factor), .SDcols = factorCols]

dateCols <- c("IndexDischDate", "ReadmitDate", "ReadmitDischargeDate")
dateFun <- function(x) as.Date(x, format = "%m/%d/%y")
Readmissions[, (dateCols) := lapply(.SD, dateFun), .SDcols = dateCols]

head(Readmissions)
Encounters <- fread("/Users/guslipkin/Downloads/Florida Poly- Senior Capstone Group/Encounters.csv", na.strings = "")

colnames(Encounters) <- str_replace_all(names(Encounters), 
                                        pattern = " ", 
                                        replacement = "")

factorCols <- c(names(Encounters)[! names(Encounters) %in% c("AdmitDate", 
                                                             "DischargeDate", 
                                                             "Age")])
Encounters[, (factorCols) := lapply(.SD, as.factor), .SDcols = factorCols]

dateCols <- c("AdmitDate", "DischargeDate")
dateFun <- function(x) as.Date(x, format = "%m/%d/%y")
Encounters[, (dateCols) := lapply(.SD, dateFun), .SDcols = dateCols]

Encounters[EncounterID %in% c("40347"), Age := 43]
Encounters[!(EncounterID %in% c("22924", 
                                "34029",
                                "35544",
                                "44683",
                                "56159",
                                "68750")) | Age <= 110]

head(Encounters)
merge(Encounters, 
      merge(Surveys,
            merge(ConnectCalls,
                  Readmissions,
                  by = "EncounterID"),
            by = "EncounterID"),
      by = "EncounterID")
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKIyBUbyBEbwotIFdoeSBpcyBDTVNfMjAgZW1wdHk/Ci0gRG91YmxlIGNoZWNrIHRoYXQgQ01TXzQxIGlzIHllcy9ubwoKCmBgYHtyfQpsaWJyYXJ5KHN0cmluZ3IpCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGRhdGEudGFibGUpCmBgYAoKYGBge3J9CkNvbm5lY3RDYWxscyA8LSBmcmVhZCgiL1VzZXJzL2d1c2xpcGtpbi9Eb3dubG9hZHMvRmxvcmlkYSBQb2x5LSBTZW5pb3IgQ2Fwc3RvbmUgR3JvdXAvQ29ubmVjdENhbGxzLmNzdiIsIG5hLnN0cmluZ3MgPSAiIikKY29sbmFtZXMoQ29ubmVjdENhbGxzKSA8LSBjKCJFbmNvdW50ZXJJRCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTGFzdFN0YXR1cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVXBkYXRlZE9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBUTEiLCAiQVExX0RhdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFRMiIsICJBUTJfRGF0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVEzIiwgIkFRM19EYXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBUTQiLCAiQVE0X0RhdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFRNSIsICJBUTVfRGF0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVE2IiwgIkFRNl9EYXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBUTciLCAiQVE3X0RhdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFROCIsICJBUThfRGF0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVE5IiwgIkFROV9EYXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBUTEwIiwgIkFRMTBfRGF0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVExMSIsICJBUTExX0RhdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFRMTIiLCAiQVExMl9EYXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBUTEzIiwgIkFRMTNfRGF0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVExNCIsICJBUTE0X0RhdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFRMTUiLCAiQVExNV9EYXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBUTE2IiwgIkFRMTZfRGF0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVExNyIsICJBUTE3X0RhdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFRMTgiLCAiQVExOF9EYXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBUTE5IiwgIkFRMTlfRGF0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVEyMCIsICJBUTIwX0RhdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFRMjEiLCAiQVEyMV9EYXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBUTIyIiwgIkFRMjJfRGF0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQVEyMyIsICJBUTIzX0RhdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFRMjQiLCAiQVEyNF9EYXRlIikKCmZhY3RvckNvbHMgPC0gYygiRW5jb3VudGVySUQiLCAiTGFzdFN0YXR1cyIsIAogICAgICAgICAgICAgICAgbmFtZXMoQ29ubmVjdENhbGxzKVtuYW1lcyhDb25uZWN0Q2FsbHMpICVsaWtlJSAiQVFbMC05XXsxLDJ9JCJdKQpDb25uZWN0Q2FsbHNbLCAoZmFjdG9yQ29scykgOj0gbGFwcGx5KC5TRCwgYXMuZmFjdG9yKSwgLlNEY29scyA9IGZhY3RvckNvbHNdCgpkYXRlQ29scyA8LSBjKCJVcGRhdGVkT24iLCAKICAgICAgICAgICAgICBuYW1lcyhDb25uZWN0Q2FsbHMpW25hbWVzKENvbm5lY3RDYWxscykgJWxpa2UlICJBUVswLTldezEsMn1fRGF0ZSJdKQpkYXRlRnVuIDwtIGZ1bmN0aW9uKHgpIGFzLkRhdGUoeCwgZm9ybWF0ID0gIiVtLyVkLyV5IikKQ29ubmVjdENhbGxzWywgKGRhdGVDb2xzKSA6PSBsYXBwbHkoLlNELCBkYXRlRnVuKSwgLlNEY29scyA9IGRhdGVDb2xzXQoKaGVhZChDb25uZWN0Q2FsbHMpCmBgYAoKCmBgYHtyfQphcUNvbHMgPC0gYygiRW5jb3VudGVySUQiLCAiTGFzdFN0YXR1cyIsICJVcGRhdGVkT24iLAogICAgICAgICAgICBuYW1lcyhDb25uZWN0Q2FsbHMpW25hbWVzKENvbm5lY3RDYWxscykgJWxpa2UlICJBUVswLTldezEsMn0kIl0pCkNvbm5lY3RMb25nZXJBUSA8LSBtZWx0LmRhdGEudGFibGUoQ29ubmVjdENhbGxzWyFpcy5uYShFbmNvdW50ZXJJRCksIC4uYXFDb2xzXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZS52YXJzID0gcGFzdGUwKCJBUSIsIDE6MjQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLm5hbWUgPSAiQVFfTnVtYmVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5uYW1lID0gIkFRX1ZhbHVlIikKCmFxQ29scyA8LSBjKCJFbmNvdW50ZXJJRCIsICJMYXN0U3RhdHVzIiwgIlVwZGF0ZWRPbiIsCiAgbmFtZXMoQ29ubmVjdENhbGxzKVtuYW1lcyhDb25uZWN0Q2FsbHMpICVsaWtlJSAiQVFbMC05XXsxLDJ9X0RhdGUiXSkKQ29ubmVjdExvbmdlckFRRGF0ZSA8LSBtZWx0LmRhdGEudGFibGUoQ29ubmVjdENhbGxzWyFpcy5uYShFbmNvdW50ZXJJRCksIC4uYXFDb2xzXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZS52YXJzID0gcGFzdGUwKCJBUSIsIDE6MjQsICJfRGF0ZSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS5uYW1lID0gIkFRX051bWJlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLm5hbWUgPSAiQVFfRGF0ZSIpCgpDb25uZWN0TG9uZ2VyQVFEYXRlWywgQVFfTnVtYmVyIDo9IHN0cl9yZXBsYWNlKEFRX051bWJlciwgIl9EYXRlIiwgIiIpXQoKQ29ubmVjdExvbmdlciA8LSBtZXJnZShDb25uZWN0TG9uZ2VyQVEsIENvbm5lY3RMb25nZXJBUURhdGUpWyFpcy5uYShBUV9WYWx1ZSldCnJtKENvbm5lY3RMb25nZXJBUSwgQ29ubmVjdExvbmdlckFRRGF0ZSkKaGVhZChDb25uZWN0TG9uZ2VyKQoKQ29ubmVjdExvbmdlclssIC5OLCBieSA9ICJBUV9WYWx1ZSJdW29yZGVyKGRlc2MoTikpXSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBBUV9WYWx1ZSwgeSA9IE4sIGxhYmVsID0gTikpICsKICBnZW9tX2NvbChmaWxsID0gImxpZ2h0Ymx1ZSIpICsKICBnZW9tX3RleHQoc2l6ZSA9IDUsIHBvc2l0aW9uID0gcG9zaXRpb25fc3RhY2sodmp1c3QgPSAwLjUpKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpCmBgYAoKCmBgYHtyfQpTdXJ2ZXlzIDwtIGZyZWFkKCIvVXNlcnMvZ3VzbGlwa2luL0Rvd25sb2Fkcy9GbG9yaWRhIFBvbHktIFNlbmlvciBDYXBzdG9uZSBHcm91cC9TdXJ2ZXlzLmNzdiIsIG5hLnN0cmluZ3MgPSAiIikKCmZhY3RvckNvbHMgPC0gYyhuYW1lcyhTdXJ2ZXlzKVshIG5hbWVzKFN1cnZleXMpICVpbiUgYygiQWRtaXREYXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDTVNfUmVwb3J0YWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTW9ydGFsaXR5RmxhZyIpXSkKU3VydmV5c1ssIChmYWN0b3JDb2xzKSA6PSBsYXBwbHkoLlNELCBhcy5mYWN0b3IpLCAuU0Rjb2xzID0gZmFjdG9yQ29sc10KCmRhdGVDb2xzIDwtIGMoIkFkbWl0RGF0ZSIpCmRhdGVGdW4gPC0gZnVuY3Rpb24oeCkgYXMuRGF0ZSh4LCBmb3JtYXQgPSAiJW0vJWQvJXkiKQpTdXJ2ZXlzWywgKGRhdGVDb2xzKSA6PSBsYXBwbHkoLlNELCBkYXRlRnVuKSwgLlNEY29scyA9IGRhdGVDb2xzXQoKU3VydmV5cyRDTVNfUmVwb3J0YWJsZSA8LSBpZmVsc2UoU3VydmV5cyRDTVNfUmVwb3J0YWJsZSA9PSAiWWVzIiwgVFJVRSwgRkFMU0UpClN1cnZleXMkTW9ydGFsaXR5RmxhZyA8LSBpZmVsc2UoU3VydmV5cyRNb3J0YWxpdHlGbGFnID09ICJZIiwgVFJVRSwgRkFMU0UpCgpsb2dpY2FsQ29scyA8LSBjKCJDTVNfMTIiLCAiQ01TXzE4IiwgIkNNU18yMSIpCmxvZ2ljYWxGdW4gPC0gZnVuY3Rpb24oeCkgaWZlbHNlKHggPT0gMSwgVFJVRSwgRkFMU0UpClN1cnZleXNbLCAobG9naWNhbENvbHMpIDo9IGxhcHBseSguU0QsIGxvZ2ljYWxGdW4pLCAuU0Rjb2xzID0gbG9naWNhbENvbHNdClN1cnZleXMgPC0gU3VydmV5c1ssIC1jKCJDTVNfNDIiLCAiQ01TXzQzIiwgIkNNU180NCIpXQoKaGVhZChTdXJ2ZXlzKQpgYGAKCmBgYHtyfQpjbXNDb2xzIDwtIGMoIlN1cnZleUlEIiwgCiAgICAgICAgICAgIG5hbWVzKFN1cnZleXMpW25hbWVzKFN1cnZleXMpICVsaWtlJSAiQ01TX1swLTldezEsMn0kIl0pClN1cnZleXNMb25nZXIgPC0gbWVsdC5kYXRhLnRhYmxlKFN1cnZleXNbIWlzLm5hKFN1cnZleUlEKSwgLi5jbXNDb2xzXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZS52YXJzID0gcGFzdGUwKCJDTVNfIiwgYygxOjMsIDY6OCwgMTA6MTMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4OjI4LCAzMCwgMzM6MzQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM3OjQxKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLm5hbWUgPSAiQ01TX051bWJlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLm5hbWUgPSAiQ01TX1Jlc3BvbnNlIilbIWlzLm5hKENNU19SZXNwb25zZSldCgpTdXJ2ZXlzTG9uZ2VyWyEoQ01TX051bWJlciAlaW4lIGMoIkNNU18xMiIsICJDTVNfMTgiLCAiQ01TXzIxIiwgIkNNU18yMyIpKV0gJT4lCiAgLlssIENNU19SZXNwb25zZSA6PSBhcy5mYWN0b3IoQ01TX1Jlc3BvbnNlKV0gJT4lCiAgLlssIC5OLCBieSA9IGxpc3QoQ01TX051bWJlciwgQ01TX1Jlc3BvbnNlKV0gJT4lCiAgZ2dwbG90KGFlcyh4ID0gQ01TX051bWJlciwgeSA9IE4sIGZpbGwgPSBmYWN0b3IoQ01TX1Jlc3BvbnNlLCBsZXZlbHMgPSBjKDU6MCkpKSkgKwogIGdlb21fYmFyKHBvc2l0aW9uID0gImZpbGwiLCBzdGF0ID0gImlkZW50aXR5IikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApLAogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSkKClN1cnZleXNMb25nZXJbKENNU19OdW1iZXIgJWluJSBjKCJDTVNfMTIiLCAiQ01TXzE4IiwgIkNNU18yMSIpKV0gJT4lCiAgLlssIENNU19SZXNwb25zZSA6PSBhcy5mYWN0b3IoQ01TX1Jlc3BvbnNlKV0gJT4lCiAgLlssIC5OLCBieSA9IGxpc3QoQ01TX051bWJlciwgQ01TX1Jlc3BvbnNlKV0gJT4lCiAgZ2dwbG90KGFlcyh4ID0gQ01TX051bWJlciwgeSA9IE4sIGZpbGwgPSBDTVNfUmVzcG9uc2UpKSArCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZmlsbCIsIHN0YXQgPSAiaWRlbnRpdHkiKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCksCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpKQoKU3VydmV5c0xvbmdlcltDTVNfTnVtYmVyID09ICJDTVNfMjMiXSAlPiUKICAuWywgQ01TX1Jlc3BvbnNlIDo9IGFzLmZhY3RvcihDTVNfUmVzcG9uc2UpXSAlPiUKICAuWywgLk4sIGJ5ID0gbGlzdChDTVNfTnVtYmVyLCBDTVNfUmVzcG9uc2UpXSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBDTVNfTnVtYmVyLCB5ID0gTiwgZmlsbCA9IGZhY3RvcihDTVNfUmVzcG9uc2UsIGxldmVscyA9IGMoMTA6MCkpKSkgKwogIGdlb21fYmFyKHBvc2l0aW9uID0gImZpbGwiLCBzdGF0ID0gImlkZW50aXR5IikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApLAogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCgoKYGBge3J9ClJlYWRtaXNzaW9ucyA8LSBmcmVhZCgiL1VzZXJzL2d1c2xpcGtpbi9Eb3dubG9hZHMvRmxvcmlkYSBQb2x5LSBTZW5pb3IgQ2Fwc3RvbmUgR3JvdXAvUmVhZG1pc3Npb25zLmNzdiIsIG5hLnN0cmluZ3MgPSAiIikKCmNvbG5hbWVzKFJlYWRtaXNzaW9ucykgPC0gc3RyX3JlcGxhY2VfYWxsKG5hbWVzKFJlYWRtaXNzaW9ucyksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuID0gIiAiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnQgPSAiIikKCmZhY3RvckNvbHMgPC0gYyhuYW1lcyhSZWFkbWlzc2lvbnMpWyEgbmFtZXMoUmVhZG1pc3Npb25zKSAlaW4lIGMoIkluZGV4RGlzY2hEYXRlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlYWRtaXREYXRlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRheXNCZXR3ZWVuQWRtc3Npb25zIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlYWRtaXREaXNjaGFyZ2VEYXRlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlYWRtaXRJbmZvLkFnZSIpXSkKUmVhZG1pc3Npb25zWywgKGZhY3RvckNvbHMpIDo9IGxhcHBseSguU0QsIGFzLmZhY3RvciksIC5TRGNvbHMgPSBmYWN0b3JDb2xzXQoKZGF0ZUNvbHMgPC0gYygiSW5kZXhEaXNjaERhdGUiLCAiUmVhZG1pdERhdGUiLCAiUmVhZG1pdERpc2NoYXJnZURhdGUiKQpkYXRlRnVuIDwtIGZ1bmN0aW9uKHgpIGFzLkRhdGUoeCwgZm9ybWF0ID0gIiVtLyVkLyV5IikKUmVhZG1pc3Npb25zWywgKGRhdGVDb2xzKSA6PSBsYXBwbHkoLlNELCBkYXRlRnVuKSwgLlNEY29scyA9IGRhdGVDb2xzXQoKaGVhZChSZWFkbWlzc2lvbnMpCmBgYAoKCmBgYHtyfQpFbmNvdW50ZXJzIDwtIGZyZWFkKCIvVXNlcnMvZ3VzbGlwa2luL0Rvd25sb2Fkcy9GbG9yaWRhIFBvbHktIFNlbmlvciBDYXBzdG9uZSBHcm91cC9FbmNvdW50ZXJzLmNzdiIsIG5hLnN0cmluZ3MgPSAiIikKCmNvbG5hbWVzKEVuY291bnRlcnMpIDwtIHN0cl9yZXBsYWNlX2FsbChuYW1lcyhFbmNvdW50ZXJzKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuID0gIiAiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50ID0gIiIpCgpmYWN0b3JDb2xzIDwtIGMobmFtZXMoRW5jb3VudGVycylbISBuYW1lcyhFbmNvdW50ZXJzKSAlaW4lIGMoIkFkbWl0RGF0ZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRpc2NoYXJnZURhdGUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBZ2UiKV0pCkVuY291bnRlcnNbLCAoZmFjdG9yQ29scykgOj0gbGFwcGx5KC5TRCwgYXMuZmFjdG9yKSwgLlNEY29scyA9IGZhY3RvckNvbHNdCgpkYXRlQ29scyA8LSBjKCJBZG1pdERhdGUiLCAiRGlzY2hhcmdlRGF0ZSIpCmRhdGVGdW4gPC0gZnVuY3Rpb24oeCkgYXMuRGF0ZSh4LCBmb3JtYXQgPSAiJW0vJWQvJXkiKQpFbmNvdW50ZXJzWywgKGRhdGVDb2xzKSA6PSBsYXBwbHkoLlNELCBkYXRlRnVuKSwgLlNEY29scyA9IGRhdGVDb2xzXQoKRW5jb3VudGVyc1tFbmNvdW50ZXJJRCAlaW4lIGMoIjQwMzQ3IiksIEFnZSA6PSA0M10KRW5jb3VudGVyc1shKEVuY291bnRlcklEICVpbiUgYygiMjI5MjQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMzQwMjkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIzNTU0NCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjQ0NjgzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNTYxNTkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI2ODc1MCIpKSB8IEFnZSA8PSAxMTBdCgpoZWFkKEVuY291bnRlcnMpCmBgYAoKYGBge3J9Cm1lcmdlKEVuY291bnRlcnMsIAogICAgICBtZXJnZShTdXJ2ZXlzLAogICAgICAgICAgICBtZXJnZShDb25uZWN0Q2FsbHMsCiAgICAgICAgICAgICAgICAgIFJlYWRtaXNzaW9ucywKICAgICAgICAgICAgICAgICAgYnkgPSAiRW5jb3VudGVySUQiKSwKICAgICAgICAgICAgYnkgPSAiRW5jb3VudGVySUQiKSwKICAgICAgYnkgPSAiRW5jb3VudGVySUQiKQpgYGAKCg==